package main

import "fmt"

func outer1() {
	c := 65
	inner := func() {
		fmt.Println("1 c=", c)
	}
	// inner 和 c 都是 outer1 的局部变量，不过就是类型不一样罢了
	inner() // 调用 压栈，压在outer1 的栈帧上面
	fmt.Println("2 c=", c)
}

func outer2() {
	c := 65
	inner := func() {
		c = 97
		fmt.Println("1 c=", c)
	}
	// inner 和 c 都是 outer1 的局部变量，不过就是类型不一样罢了
	inner() // 调用 压栈，压在outer1 的栈帧上面
	fmt.Println("2 c=", c)
}

func outer3() {
	c := 65
	inner := func() {
		c = 97
		fmt.Println("1 c=", c)
		c := c + 1
		fmt.Println("3 c=", c)

	}
	// inner 和 c 都是 outer1 的局部变量，不过就是类型不一样罢了
	inner() // 调用 压栈，压在outer1 的栈帧上面
	fmt.Println("2 c=", c)
}

func main() {
	// outer1()
	// inner() // 因为它是 outer1 的局部变量，对外不可见
	// outer2()
	outer3()
}
